"""
ch35 多线程间操作数据，是没有加锁的，两个多线程操作，所以期待的结果应该是2，而结果却是1，就是因为没有加锁
- 多线程操作如何使用锁
- 分析原理
锁是一个同步机制，用来强制多个线程访问相同的资源时做一下限制。一个锁有两种状态，锁上，没有锁上。
如果该状态是锁上状态，那就不允许并存的线程访问该代码区域，除非该锁是释放状态。

锁的两个函数很是重要
- lock.acquire() 开启锁，并进行阻塞
- lock.release() 释放锁的状态，也就是关锁
注意：在加锁后，一定要记得关锁

任务：
启动两个线程，设置一个全局变量为8192，当全局变量小于16384时，在该线程中锁区域中，一直 *2 直到不满足小于16384时，释放锁。
第二个线程判断当前全局变量的值如果大于1，那么一直 除以2,直到值不满足小于1释放锁，来回循环数据
先自己写，写完后，参考ch37_多线程数据交互加锁-2
"""
# import Lock
from threading import Thread, Lock
import time

database_value = 0


def increase(lock):
    global database_value

    # lock the state 加锁
    lock.acquire()

    local_copy = database_value
    local_copy += 1
    time.sleep(0.1)
    database_value = local_copy

    # unlock the state 去锁
    lock.release()


def increase2(lock):
    global database_value
    # 简化写法，和with open() 文件操作类似，做了内部封装
    with lock:
        local_copy = database_value
        local_copy += 1
        time.sleep(0.1)
        database_value = local_copy


if __name__ == "__main__":
    # create a lock 创建一个锁
    lock = Lock()

    print('Start value: ', database_value)

    # pass the lock to the target function
    t1 = Thread(target=increase, args=(lock,))  # notice the comma after lock since args must be a tuple
    t2 = Thread(target=increase, args=(lock,))

    t1.start()
    t2.start()

    t1.join()
    t2.join()

    print('End value:', database_value)

    print('end main')
